package com.cn.hnust.controller;

import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.cn.hnust.entity.TextMessage;
import com.cn.hnust.utils.MessageUtil;
import com.cn.hnust.utils.SignUtils;




/** 
* 类说明:微信入口
* @ClassName: WechatController
* @author ht_lixiang
* @date 2016年11月11日 上午10:11:25 
* @updateAuthor 
* @updateTime 
* @updateReason
* @version V1.0 
*/ 

@Controller
public class WechatController {
	
	/** 
	* 方法说明:初始化校验请求来自服务器
	* @Title: initWechat
	* @return 
	* @see 传入参数
	* @see 返回参数
	* @author ht_lixiang
	* @date 2016年11月11日 上午10:18:18 
	* @updateAuthor 
	* @updateTime 
	* @updateReason
	*/
	@RequestMapping(value = "wct-bin/wechat/initWeixin", method = RequestMethod.GET, produces = "application/json;charset=utf-8")
	@ResponseBody
	public String initWechat(HttpServletRequest request, HttpServletResponse response) {
		
		System.out.println("------微信服务器请求进入----------");
		
		// 微信加密签名
		String signature = request.getParameter("signature");
		// 时间戳
		String timestamp = request.getParameter("timestamp");
		// 随机数
		String nonce = request.getParameter("nonce");
		// 随机字符串
		String echostr = request.getParameter("echostr");
		
		// 通过检验signature对请求进行校验，若校验成功则原样返回echostr，表示接入成功，否则接入失败
		if (SignUtils.checkSignature(signature, timestamp, nonce)) {
			System.out.println(echostr);
			return echostr;
		}
		return echostr;
	}
	
	 /** 
	* 方法说明:自动回复消息
	* @Title: responseMessage
	* @param request
	* @return 
	* @see 传入参数
	* @see 返回参数
	* @author ht_lixiang
	* @date 2016年11月11日 上午11:10:06 
	* @updateAuthor 
	* @updateTime 
	* @updateReason
	*/
	@RequestMapping(value = "wct-bin/wechat/initWeixin", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
	@ResponseBody
	public String responseMessage(HttpServletRequest request) {
		 // xml格式的消息数据
	        String respXml = null;
	        // 默认返回的文本消息内容
	        String respContent = "未知的消息类型！";
	        try {
	            // 调用parseXml方法解析请求消息
	            Map<String,String> requestMap = MessageUtil.parseXml(request);
	            // 发送方帐号
	            String fromUserName = requestMap.get("FromUserName");
	            // 开发者微信号
	            String toUserName = requestMap.get("ToUserName");
	            // 消息类型
	            String msgType = requestMap.get("MsgType");
	 
	            // 回复文本消息
	            TextMessage textMessage = new TextMessage();
	            textMessage.setToUserName(fromUserName);
	            textMessage.setFromUserName(toUserName);
	            textMessage.setCreateTime(new Date().getTime());
	            textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
	 
	            // 文本消息
	            if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
	                respContent = "您发送的是文本消息！";
	            }
	            // 图片消息
	            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
	                respContent = "您发送的是图片消息！";
	            }
	            // 语音消息
	            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
	                respContent = "您发送的是语音消息！";
	            }
	            // 视频消息
	            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VIDEO)) {
	                respContent = "您发送的是视频消息！";
	            }
	            // 视频消息
	            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_SHORTVIDEO)) {
	                respContent = "您发送的是小视频消息！";
	            }
	            // 地理位置消息
	            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
	                respContent = "您发送的是地理位置消息！";
	            }
	            // 链接消息
	            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
	                respContent = "您发送的是链接消息！";
	            }
	            // 事件推送
	            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
	                // 事件类型
	                String eventType = requestMap.get("Event");
	                // 关注
	                if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
	                    respContent = "谢谢您的关注！";
	                }
	                // 取消关注
	                else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
	                    // TODO 取消订阅后用户不会再收到公众账号发送的消息，因此不需要回复
	                }
	                // 扫描带参数二维码
	                else if (eventType.equals(MessageUtil.EVENT_TYPE_SCAN)) {
	                    // TODO 处理扫描带参数二维码事件
	                }
	                // 上报地理位置
	                else if (eventType.equals(MessageUtil.EVENT_TYPE_LOCATION)) {
	                    // TODO 处理上报地理位置事件
	                }
	                // 自定义菜单
	                else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
	                    // TODO 处理菜单点击事件
	                }
	            }
	            // 设置文本消息的内容
	            textMessage.setContent(respContent);
	            // 将文本消息对象转换成xml
	            respXml = MessageUtil.messageToXml(textMessage);
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	        System.out.println(respXml);
	        return respXml;
	    }
	
	@RequestMapping(value = "wechat/initWechatsss", method = RequestMethod.GET, produces = "application/json;charset=utf-8")
	@ResponseBody
	public String initWecha1t(HttpServletRequest request, HttpServletResponse response) {
		
		
		return "225455";
	}

}
